// 函数中  -- 未进行绑定 指代上一次调用它的对象
var a = 'hello'

function foo() {
  console.log(this.a)
}
foo() // hello   调用的对象是window






// 隐式绑定
function foo () {
  console.log(this.a)
}

var obj = {
  a: 'hello',
  foo: foo
}
obj.foo() // hello






function foo () {
  console.log(this.a)
}
var obj = {
  a: 'hello',
  foo: foo
}
var a = 'window'
var bar = obj.foo
obj.foo() // hello
bar() // 'window'





// 函数 --绑定 
function foo () {
  console.log(this.a)
}
var obj = {
  a: 'hello'
}
foo.call(obj) // hello

var bin = foo.bind(window)
bin() // window

var app = foo.apply(window) // window




// 由构造函数创建的对象当中的this，指向该对象
function fool (a) {
  this.a = a
}

var bar = new fool('hello')
console.log(bar.a) // hello

// 由字面量创建的对象this指向Window
var a = 'window'
var obj = {
  a: 'local',
  b: this.a
}
console.log(obj.b) // window





// this在闭包中的几个应用   闭包中的this代指调用闭包的那个对象
var flag = 'window'
var object = {
  flag: 'lcoal',
  satFlag: function () {
    return function () {
      console.log(this.flag)
    }
  },
  sayyy: function () {
    return this.satFlag()()
  }
}
object.satFlag()() // window
object.sayyy() // window

// 定时器当中的this
function Person () {
  this.age = 0
  setTimeout(function () {
    console.log(this)
  }, 0)
} 
var p = new Person() // window


// 箭头函数中的this
function Desk () {
  this.age = 0
  setTimeout(() => {
    console.log(this.age)
  }, 0)
}
var d = new Desk() // 0  new 的时候箭头函数中的this继承自desk

var ob = {
  i: 10,
  b: () => console.log(this.i, this), // this即window
  c: function () {
    console.log(this.i, this) // 调用c方法时，this指代ob
  }
}
ob.b() // undefined window
ob.c() // 10 ob: {...}
